package atguigu.cglib.cglibMethod;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * 手动实现一个代理类
 * 
 * 代理模式的好处,可以在要被代理的对象的方法外,增加一些代码逻辑
 * @author ex_yejing1
 *
 */
public class ProductProxy2 {
	// 要代理的对象,从原始类向上抽取的一个接口
	private IProduct target = null;

	public ProductProxy2(IProduct target) {
		this.target = target;
	}
	
	public IProduct getProductProxy() {
		IProduct proxy = null;
		// 代理对象由哪一个类加载器负责加载
		Class loader = target.getClass();
		// 代理对象的类型，即其中有哪些方法
		MethodInterceptor met = new MethodInterceptor() {
			@Override
			public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
				Object returnValue = null;
				if ("saleProduct".equals(arg1.getName())) {
					pre(); // 前置处理
					Float money = (float) (0.8 * (Float) arg2[0]);
					returnValue = arg1.invoke(target, money);
					after(); // 后置处理
				}
				return returnValue;
			}
		};
		return proxy = (IProduct) Enhancer.create(loader, met);
	}
	
	public void pre() {
		System.out.println("前置处理");
	}
	
	public void after() {
		System.out.println("后置处理");
	}
}
